/**
 * 
 */
package cn.biplam.front.template.complex;

import cn.biplam.common.paramters.name.NameCommon;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.HtmlDiv;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.htmlscript.script.AjxScript;
import cn.biplam.front.template.Template;
import cn.biplam.front.template.base.HiddenParams;

/**
 * 用action调用一个ViewComponent<BR>
 * 不限定请求方式,可是M/P,本模板返回的是一个HtmlWindow,然后再发起action请求<BR>
 * 使用方法<BR>
 * 1.创建本模板(传入pageId,请求actionid、提交actionid、请求数据主键Id)<BR>
 * 2.putParams放入需要提交给"调用action"的参数<BR>
 * 3.putTransParam放入供请求页面提交的参数(在NameCommon.Other_Container_ID指示的页面容器中)<BR>
 * 4.return 本模板.get()<BR>
 * @author 	WangSong 2009-11-26 上午11:57:02
 * @version 1.0
 */
public class ViewCall implements Template{

	/** 用于请求提交的参数容器ID补充*/
	private final String cID_Call="_vc";
	private final String cID_Target="_tg";

	/** 模板主容器*/
	private HtmlWindow div;

	/** 页面ID*/
	private String pageId;

	/** 请求的actionId*/
	private String reqActionId;

	/** 提交的actionId*/
	private String submitActionId;

	/** 数据主键ID*/
	private String reqRecordId;

	/** 请求提交参数容器*/
	private HiddenParams params;

	/** 传递提交参数容器*/
	private HiddenParams transParams;


	/**
	 * 构造方法
	 * @param pageId			ViewCall模板的页面ID
	 * @param reqActionId		请求的actionId
	 * @param submitActionId	提交的actionId
	 * @param reqRecordId		请求的recordId
	 * @throws ErrorMessage
	 */
	public ViewCall(String pageId,String reqActionId,
			String submitActionId,String reqRecordId) throws ErrorMessage{
		this.pageId=pageId;
		this.reqActionId=reqActionId;
		this.submitActionId=submitActionId;
		this.reqRecordId=reqRecordId;
		this.div=new HtmlDiv(this.pageId);
		this.params = new HiddenParams(this.pageId+this.cID_Call,reqRecordId);

		this.params.put(NameCommon.Page_ID, pageId);
		//放入提交actionID,请求页面确定时提交到该action
		this.params.put(NameCommon.RESPONSE_ACT_ID, this.submitActionId);
		
		this.transParams=new HiddenParams(this.pageId);
		//放入附加参数容器名称,当请求页面提交时，提交附加参数容器
		this.params.put(NameCommon.Other_Container_ID, this.transParams.getID());
	}

	/**
	 * 返回页面对象
	 * @return	HtmlWindow
	 * @throws ErrorMessage
	 */
	public HtmlWindow get() throws ErrorMessage {
		HtmlDiv call=new HtmlDiv(this.pageId+this.cID_Call);
		call.put(this.params.get());
		div.put(call);
		div.put(this.transParams.get());
		
		String tid=this.getTargetCID();
		div.put(new HtmlDiv(tid));
		div.bind(
				AjxScript.getM(
						this.params.getID(),
						this.reqActionId, 
						this.reqRecordId, 
						tid
				)
		);
		return div;
	}
	
	/**
	 * 返回请求Action的目标容器ID(也是页面刷新时的目标容器)
	 * @return	String
	 */
	public String getTargetCID(){
		return this.pageId+this.cID_Target;
	}
	
	/**
	 * 返回提交参数容器ID(请求Action的提交容器)
	 * @return	String
	 */
	public String getContainerID(){
		return this.params.getID();
	}

	/**
	 * 放入一个需要提交给请求组件的数据参数
	 * @param name
	 * @param value
	 * @throws ErrorMessage
	 */
	public void putParam(String name,String value) throws ErrorMessage{
		this.params.put(name, value);
	}
	
	/**
	 * 放入一个需要传递给提交页面的数据参数
	 * @param name
	 * @param value
	 * @throws ErrorMessage
	 */
	public void putTransParam(String name,String value) throws ErrorMessage{
		this.transParams.put(name, value);
	}
}
